package es.sjdigital.rv.datos.dao;

import es.sjdigital.rv.datos.connection.DbConnection;
import es.sjdigital.rv.datos.vo.PermisosVO;
import es.sjdigital.rv.rv_error.Rv_error_dto;
import es.sjdigital.rv.rv_error.Rv_error_dtoE;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

/**
 * Permite el acceso a la tabla permisos
 * @author jcmanso
 *
 */
public class PermisosDAO {

	private static final Logger log = Logger.getLogger(String.class.getName());
	
	/**
	 * 
	 * @param perm Permiso a introducir o modificar. Id 0 si es nueva
	 * @return id del permiso
	 */
	public int setPermiso(PermisosVO perm) {
		log.finest("Comienzo DAO");
		int resp=0;
		DbConnection conex= new DbConnection();
		try {
			Statement db = conex.getConnection().createStatement();
			//Si nuevo permiso
			if (perm.getId()==0){
				log.finest("Consulta base de datos");
				db.executeUpdate("INSERT INTO permisos (formula, propietario, url) VALUES('"
					+perm.getFormula()+"','"
					+perm.getPropietario()+"','"
					+perm.getUrl()+"')", db.RETURN_GENERATED_KEYS);
				ResultSet rs = db.getGeneratedKeys();
				if (rs != null && rs.next()) {
					resp = rs.getInt(1);
				}
				else resp = 0;
			}
			//Si no permiso existente
			else{
				String query = "UPDATE permisos" +
						" SET formula = '"+perm.getFormula()+
						"', propietario ='"+perm.getPropietario()+
						"', url = '"+perm.getUrl()+ "' WHERE permisos.id = '"+perm.getId()+"'";
				db.executeUpdate(query);
				 resp = perm.getId();
			}
			db.close();
			conex.desconectar();
		} catch (SQLException e) {
			//throw new Rv_error_dto(101, "Error actualizando la base de datos: "+e.getMessage(), "setPermiso_op");
		} catch (Exception e) {
			//throw new Rv_error_dto(100, "Error en el DAO: "+e.getMessage(), "setPermiso");
		}
		log.finest("Fin DAO");
		return resp;
	}
	
	public List<String> getFormulas(String formula) /*throws Rv_error_dto */{
		log.finest("Comienzo DAO");
		//Comprobamos que formula no sea nulo
		if (formula == null) 
			formula = new String("");
		
		//Inicializamos el resultado
		List<String> result = new ArrayList<String>();
		
		DbConnection conex= new DbConnection();
		try {
			Statement db = conex.getConnection().createStatement();
			String query = "SELECT DISTINCT formula FROM permisos WHERE formula LIKE '%"+formula+"%'";
			log.finest("Consulta base de datos "+query);
			ResultSet st = db.executeQuery(query);
			
			//Guardamos los resultados
			while (st.next()){
				result.add(st.getString("formula"));
			}
			db.close();

		} catch (SQLException e) {
			//throw new Rv_error_dto(101, "Error actualizando la base de datos: "+e.getMessage(), "getFormulas");
		} catch (Exception e) {
			//throw new Rv_error_dto(100, "Error en el DAO: "+e.getMessage(), "getFormulas");
		}
		log.finest("Fin DAO");

		return result;
	}
	
	public List<String[]> getPropietarios(String busqueda) /*throws Rv_error_dto*/ {
		log.finest("Comienzo DAO");

		//Comprobamos que la busqueda no sea nula
		if (busqueda == null)
			busqueda = new String("");
		
		//Inicializamos el resultado
		List<String[]> result = new ArrayList<String[]>();
				
		DbConnection conex= new DbConnection();
		try {
			Statement db = conex.getConnection().createStatement();
			String query = "SELECT DISTINCT propietario, url FROM permisos WHERE propietario LIKE '%"+busqueda+"%'";
			log.finest("Consulta base de datos "+query);
			ResultSet st = db.executeQuery(query);
			
			//Almacenamos resultados
			while(st.next()){
				String[] parcial = new String[2];
				parcial[0] = st.getString("propietario");
				parcial[1] = st.getString("url");
				result.add(parcial);
			}
			db.close();

		} catch (SQLException e) {
			//throw new Rv_error_dto(101, "Error actualizando la base de datos: "+e.getMessage(), "getPropietarios");
		} catch (Exception e) {
			//throw new Rv_error_dto(100, "Error en el DAO: "+e.getMessage(), "getPropietarios");
		}
		log.finest("Fin DAO");
		return result;
	}
	public List<PermisosVO> getPermisos(int id_busqueda) /*throws Rv_error_dto */{
		log.finest("Comienzo DAO");
		
		//Inicializamos el resultado
		List<PermisosVO> result = new ArrayList<PermisosVO>();
		
		DbConnection conex= new DbConnection();
		try {
			Statement db = conex.getConnection().createStatement();
			String query = new String();
			if (id_busqueda!=0)
				query = "SELECT * FROM permisos WHERE id = '"+id_busqueda+"'";
			else
				query = "SELECT * FROM permisos";
			log.finest("Consulta base de datos "+query);
			ResultSet st = db.executeQuery(query);
			
			while (st.next()) {
				PermisosVO perm = new PermisosVO();
				perm.setId(st.getInt("id"));
				perm.setFormula(st.getString("formula"));
				perm.setPropietario(st.getString("propietario"));
				perm.setUrl(st.getString("url"));
				
				result.add(perm);
			}
			db.close();

		} catch (SQLException e) {
			//throw new Rv_error_dto(101, "Error actualizando la base de datos: "+e.getMessage(), "getPermisos");
		} catch (Exception e) {
			//throw new Rv_error_dto(100, "Error en el DAO: "+e.getMessage(), "getPermisos");
		}
		log.finest("Fin DAO");
		return result;
	}
	
	
}
